package com.swn.common.util;

import java.io.File;
import java.util.Properties;

import org.apache.log4j.Logger;

/**数据库连接参数加密工具类
 * 思路：用户名和密码通过特殊的字符串连接然后解密，再序列化到文件；读取后，分割并解密
 * @author taozhaocai
 * @Date 2016年6月16日  下午4:14:45
 * @Note <这里是该类的使用注意事项>
 */
public class DbLinkUtil {

	private static Logger logger = Logger.getLogger("DbLinkUtil.class");
	/**数据库参数属性文件目录***/
	private static String dbPropertiesFileName = "db.data";
	private static String dbPropertiesPath = StaticParam.getClassesPath()+dbPropertiesFileName;
	
	/**用户名和密码加密后链接字符串**/
	private static String splitStr="!#$%";
	
	/**
	 * 解码数据库连接参数并放置在属性对象中
	 * 
	 * @return Properties
	 *
	 * @Author taozhaocai
	 * @Date 2016年6月16日 下午4:52:10
	 */
	public static Properties decodeProperties() {
		Properties properties = new Properties();
		try {
			logger.info(dbPropertiesPath);
			//从加密文件中读取属性对象
		     String secretStr = (String)SerializableUtil.readObjFromFile(dbPropertiesPath);
		     String decStr = DeEnCode.decode(secretStr);
		     String[] ay = decStr.replace(splitStr, " ").split(" ");
			//获取与数据库连接相关的属性,并解码
			String user = ay[0];
			String password = ay[1];
			/*String driverClass = DeEnCode.decode(properties.getProperty("driverClass"));
			String jdbcUrl = DeEnCode.decode(properties.getProperty("jdbcUrl"));*/
			
			//解码后的参数放置到属性对象中
			properties.put("user", user);
			properties.put("password", password);
			/*properties.put("driverClass", driverClass);
			properties.put("jdbcUrl", jdbcUrl);*/
		
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		return properties;
	}
	
	/**
	 * 对数据库连接参数进行加密且序列化到文件中
	 * 
	 * @param user
	 * @param password
	 *
	 * @Author Leon
	 * @Date 2016年6月16日 下午4:28:49
	 */
	public static void ecodeProperties(String user,String password){
			try {
				logger.info(dbPropertiesPath);
				String secretStr =  DeEnCode.encode(user+splitStr+password);
				logger.info("读取数据库连接加密参数：");
				//file路径
				SerializableUtil.writeObjToFile(secretStr, dbPropertiesPath);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			
	    
	}
	
	
	public static void main(String[] args) {
		/**生成放置到classes下的db**/
		logger.info(dbPropertiesPath);
		String user = "root";
		String password = "Swn#test@MySql#2017";   //swnsql2017  Swn#test@MySql#2017
		DbLinkUtil.ecodeProperties(user, password);
		logger.info("读取数据库连接明文参数：");
		Properties properties = decodeProperties() ;
		logger.info(properties);
		
		/**生成放置到conf下**/
		dbPropertiesPath = new  File("").getAbsolutePath()+"\\conf\\"+dbPropertiesFileName;
		
		DbLinkUtil.ecodeProperties(user, password);
		logger.info("读取数据库连接明文参数：");
		Properties properties2 = decodeProperties() ;
		logger.info(properties2);
		
	}
	
}
